package com.eduagent.xwqeduagent.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.eduagent.xwqeduagent.api.characterRecognition.HandwrittenTextRecognition.HandwrittenTextRecognitionAPI;
import com.eduagent.xwqeduagent.api.characterRecognition.HandwrittenTextRecognition.HandwrittenTextRecognitionResult;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

@Slf4j
@RestController
@RequestMapping("/handwritten")
@Tag(name = "手写文字识别", description = "手写文字识别相关接口")
public class HandwrittenTextRecognitionController {

    @Value("${xunfei.handwritten.appid:}")
    private String appId;

    @Value("${xunfei.handwritten.apikey:}")
    private String apiKey;

    /**
     * 上传图片识别手写文字
     *
     * @param file 图片文件
     * @param language 语言类型，默认为中英文
     * @param location 是否返回位置信息，默认为false
     * @return 识别结果
     */
    @Operation(summary = "手写文字识别", description = "通过上传图片识别手写文字")
    @PostMapping(value = "/recognize", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public Map<String, Object> recognizeHandwrittenText(
            @Parameter(description = "图片文件，支持jpg/png/bmp格式，最大4M") @RequestPart("file") MultipartFile file,
            @Parameter(description = "语言类型，可选值：en（英文），cn|en（中文或中英混合），默认为中英文") @RequestParam(value = "language", defaultValue = "cn|en") String language,
            @Parameter(description = "是否返回位置信息，可选值：true（是），false（否），默认为false") @RequestParam(value = "location", defaultValue = "false") String location) {
        
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 检查API配置
            if (appId == null || appId.isEmpty() || apiKey == null || apiKey.isEmpty()) {
                log.error("讯飞平台配置缺失，请配置xunfei.handwritten.appid和xunfei.handwritten.apikey");
                result.put("success", false);
                result.put("message", "系统配置错误，请联系管理员");
                return result;
            }
            
            // 检查文件是否为空
            if (file.isEmpty()) {
                result.put("success", false);
                result.put("message", "上传文件为空");
                return result;
            }
            
            // 检查文件大小
            if (file.getSize() > 4 * 1024 * 1024) {
                result.put("success", false);
                result.put("message", "文件大小超过4M限制");
                return result;
            }
            
            // 检查文件类型
            String contentType = file.getContentType();
            if (contentType == null || !(contentType.contains("jpeg") || contentType.contains("png") || contentType.contains("bmp"))) {
                result.put("success", false);
                result.put("message", "仅支持jpg/png/bmp格式图片");
                return result;
            }
            
            // 创建API实例
            HandwrittenTextRecognitionAPI api = new HandwrittenTextRecognitionAPI(appId, apiKey);
            
            // 读取上传的文件内容
            byte[] fileContent = file.getBytes();
            
            // 调用API进行识别
            String jsonResult = api.recognizeFromByteArray(fileContent, language, location);
            log.info("手写文字识别API返回结果：{}", jsonResult);
            
            // 解析识别结果
            HandwrittenTextRecognitionResult recognitionResult = HandwrittenTextRecognitionResult.parseResult(jsonResult);
            
            if (recognitionResult.isSuccess()) {
                result.put("success", true);
                result.put("message", "识别成功");
                result.put("text", recognitionResult.getRecognizedText());
                result.put("textLines", recognitionResult.getRecognizedTexts());
                
                // 如果请求了位置信息，返回原始结果中的data部分
                if ("true".equalsIgnoreCase(location)) {
                    JSONObject jsonObject = JSON.parseObject(jsonResult);
                    if (jsonObject.containsKey("data")) {
                        result.put("data", jsonObject.get("data"));
                    }
                }
            } else {
                result.put("success", false);
                result.put("message", "识别失败：" + recognitionResult.getDesc());
                result.put("code", recognitionResult.getCode());
            }
            
        } catch (IOException e) {
            log.error("处理上传文件失败", e);
            result.put("success", false);
            result.put("message", "处理上传文件失败：" + e.getMessage());
        } catch (Exception e) {
            log.error("识别手写文字异常", e);
            result.put("success", false);
            result.put("message", "系统异常：" + e.getMessage());
        }
        
        return result;
    }
    
    /**
     * 通过Base64编码识别手写文字
     *
     * @param base64 图片Base64编码
     * @param language 语言类型，默认为中英文
     * @param location 是否返回位置信息，默认为false
     * @return 识别结果
     */
    @Operation(summary = "Base64手写文字识别", description = "通过Base64编码识别手写文字")
    @PostMapping("/recognize-base64")
    public Map<String, Object> recognizeHandwrittenTextByBase64(
            @Parameter(description = "图片Base64编码，不含前缀") @RequestParam("base64") String base64,
            @Parameter(description = "语言类型，可选值：en（英文），cn|en（中文或中英混合），默认为中英文") @RequestParam(value = "language", defaultValue = "cn|en") String language,
            @Parameter(description = "是否返回位置信息，可选值：true（是），false（否），默认为false") @RequestParam(value = "location", defaultValue = "false") String location) {
        
        Map<String, Object> result = new HashMap<>();
        
        try {
            // 检查API配置
            if (appId == null || appId.isEmpty() || apiKey == null || apiKey.isEmpty()) {
                log.error("讯飞平台配置缺失，请配置xunfei.handwritten.appid和xunfei.handwritten.apikey");
                result.put("success", false);
                result.put("message", "系统配置错误，请联系管理员");
                return result;
            }
            
            // 检查Base64是否为空
            if (base64 == null || base64.isEmpty()) {
                result.put("success", false);
                result.put("message", "Base64编码为空");
                return result;
            }
            
            // 检查Base64大小
            if (base64.length() > (4 * 1024 * 1024) * 1.33) { // Base64编码大约是原始大小的4/3
                result.put("success", false);
                result.put("message", "Base64编码大小超过限制");
                return result;
            }
            
            // 创建API实例
            HandwrittenTextRecognitionAPI api = new HandwrittenTextRecognitionAPI(appId, apiKey);
            
            // 调用API进行识别
            String jsonResult = api.recognizeFromBase64(base64, language, location);
            log.info("手写文字识别API返回结果：{}", jsonResult);
            
            // 解析识别结果
            HandwrittenTextRecognitionResult recognitionResult = HandwrittenTextRecognitionResult.parseResult(jsonResult);
            
            if (recognitionResult.isSuccess()) {
                result.put("success", true);
                result.put("message", "识别成功");
                result.put("text", recognitionResult.getRecognizedText());
                result.put("textLines", recognitionResult.getRecognizedTexts());
                
                // 如果请求了位置信息，返回原始结果中的data部分
                if ("true".equalsIgnoreCase(location)) {
                    JSONObject jsonObject = JSON.parseObject(jsonResult);
                    if (jsonObject.containsKey("data")) {
                        result.put("data", jsonObject.get("data"));
                    }
                }
            } else {
                result.put("success", false);
                result.put("message", "识别失败：" + recognitionResult.getDesc());
                result.put("code", recognitionResult.getCode());
            }
            
        } catch (Exception e) {
            log.error("识别手写文字异常", e);
            result.put("success", false);
            result.put("message", "系统异常：" + e.getMessage());
        }
        
        return result;
    }
} 